package com.tedu.day02.oop;

/**
 * 抽象类特点<补充>
 * 类：成员变量/成员方法/构造方法
 * 抽象类:成员变量/成员方法/构造方法
 * 创建抽象类---普通类变成（实现）子类--继承抽象类
 * 成员变量：既可以变量也可以常量
 * 构造方法：有，用于子类调用抽象【父】类的成员变量---赋值
 * 成员方法：既可以抽象，非抽象
 * 抽象方法与与非抽象方法出现在抽象类问题：
 * A：抽象方法【重写】强制要求子类完成父类抽象方法
 * B：非抽象方法 【拓展】子类继承的事情，提供代码复用率
 */
   abstract class Foo{
    //成员变量
    public int i=10;
    public int J=20;//成员变量：常量
    //Java强类型语言：大小写分明
    public int j=30;
    //构造方法

    public Foo() {
        this(30); //调用当前类的其他构造器
    }

    public Foo(int i) {
        this.i = 30;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法:非抽象方法
    public void method(){
        System.out.println("Foo    method");
    }
}

//实现（子）类
class Goo extends Foo{

    public void show() {
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类---继承---多态性---向上造型
        Foo f = new Goo();
        //①实例化---子类的构造器，默认存在无参构造器，在通过super（）调用无参构造器，
        //②执行抽象类无参构造器，发现有this（参数）调用本类
        System.out.println(f.i); //  30
        System.out.println(f.J);

        f.show();  //输出：Goo show  重写
        f.method(); //输出：Goo method 拓展【子类方法缩写】
    }

    /*
       拓展：abstract关键共存问题*/
    abstract class Aoo {
        //private abstract void show1(); 冲突
        //public final abstract void show2();冲突
        //public static abstract void show3();
        //无意义：静态方法需要加语法块{}，抽象方法
    }
}